onkeydown v dbgridu, kdyz je editovano..
Otázka od: Jan Rizek
31. 5. 2004 9:47
Problem obsluhy klaves pri editovani v gridu:
potreboval bych zadelat do komponenty dbgrid (jejiho potomka) obsluhu
stisknute klavesy. Pri rozeditovani policka gridu ovsem program do KeyDown;
(override) dbgridu vubec nedojde - obslouzi se jen na urovni TWinControl.
Message vm_keydown se vubec neodchyti - grid se sklada z MaskEditu?? a pri
editaci jsme v jenom z nich?? Je to tak?
Vyresili jsme to obsluhou z formulare - KeyPrewiew:=true a na onKeyDown
zavolam metodu naseho DBGridu.
Je to ale trochu pres ruku. Nelze to nejak vyresit na urovni komponenty?
Nemate s tim nejake zkusenosti?
Co s tim?
JR
Odpovedá: Marek Dostal
31. 5. 2004 10:31
> potreboval bych zadelat do komponenty dbgrid (jejiho potomka) obsluhu
> stisknute klavesy. Pri rozeditovani policka gridu ovsem program do
KeyDown;
> (override) dbgridu vubec nedojde - obslouzi se jen na urovni TWinControl.
>
> Message vm_keydown se vubec neodchyti - grid se sklada z MaskEditu?? a pri
> editaci jsme v jenom z nich?? Je to tak?
DBGrid si pri editaci vytvari interne InplaceEditor (viz Grids.pas).
V potomkovi DBGrid chytam klavesy bud
1) predefinovanemi metody KeyDown:
procedure TMyGrid.KeyDown(var Key: Word; Shift: TShiftState);
begin
if key=vk_escape then neco ;
if key=vk_f1 then neco;
inherited KeyDown(Key,Shift);
end;
2) interne si priradim do udalosti OnKeyDown mou proceduru MyOnKeyDown:
constructor TMyGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
OnKeyDown:=MyOnKeyDown;
end;
procedure TMyGrid.MyOnKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
if (Key=vk_F1) and (Shift=[]) then neco;
if (key=vk_f2) and and (Shift=[]) then neco;
end;
3) a navic si v predefinovane metode KeyPress chytam oddelovace tisicu, tak
aby bylo jedno zda se stiskne tecka nebo carka, obdobne pro datum:
procedure TAgniGrid.KeyPress(var Key: Char);
begin
if pole.DataType in [ftFloat,ftBCD,ftFMTBcd] then
begin
if Key in ['.',','] then Key:=DecimalSeparator;
end else
if pole.DataType in [ftDate,ftDateTime] then
begin
if Key in ['.',','] then Key:=DateSeparator;
end;
inherited KeyPress(Key);
end;
Marek Dostal
D7Prof, WinXP Home, FireBird 1.0.2